/**
 * 
 */
package database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import beans.Produit;

/**
 * @author FRED
 * 
 */
public class ProduitDAO implements DAO<Produit>{

	Connection connexion;

	/**
	 * @param connexion
	 */
	public ProduitDAO(Connection connexion) {
		super();
		this.connexion = connexion;
	}

	/**
	 * @param produit
	 * @return id du produit en bdd
	 */
	public int add(Produit produit) {
		int id = -1;
		// insert d'un produit en bdd
		PreparedStatement prstm;
		try {

			prstm = MaConnexion
					.getInstance()
					.getConnexion()
					.prepareStatement(
							"INSERT INTO produit (name, price, quantity, unit) VALUES (?, ?, ?, ?)",
							PreparedStatement.RETURN_GENERATED_KEYS);
			prstm.setString(1, produit.getName());
			prstm.setDouble(2, produit.getPrice());
			prstm.setInt(3, produit.getQuantity());
			prstm.setString(4, produit.getUnit());

			// résultat de la requête
			prstm.execute(); // preparedstatement returns false on update
			boolean success = (prstm.getUpdateCount() == 1); // (insert d'un
																// seul
			// produit)
			// insert d'un produit ok
			if (success) {
				// récupération de l'id du produit inséré
				ResultSet keys = prstm.getGeneratedKeys();
				// normalement 1 seule id
				if (keys.first()) {
					// récupération de l'id
					id = prstm.getGeneratedKeys().getInt(1);
				}
			}
			// fermeture du preparedstatement
			prstm.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block SQLException
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return id;
	}

	/**
	 * @param id
	 * @return produit correspondant à id si existant
	 */
	public Produit get(int id) {
		Produit produit = new Produit();

		// récupération en bdd du produit
		PreparedStatement prstm;
		try {

			prstm = MaConnexion
					.getInstance()
					.getConnexion()
					.prepareStatement(
							"SELECT id, name, price, quantity, unit FROM produit WHERE id = ?");
			prstm.setInt(1, id);
			// résultat de la requête
			boolean success = prstm.execute();

			// ajout des produits à la liste qui sera donc mis à jour si la
			// bdd est modifiée
			if (success) {
				ResultSet rs = prstm.getResultSet();
				produit = new Produit(rs.getInt("id"), rs.getString("name"),
						rs.getInt("quantity"), rs.getString("unit"),
						rs.getDouble("price"));
			}
			// fermeture du ResultSet
			prstm.getResultSet().close();
			// fermeture du preparedstatement
			prstm.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block SQLException
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return produit;
	}

	/**
	 * @param produit
	 * @return true si update ok
	 */
	public boolean update(Produit produit) {
		boolean success = false;

		// update du produi ten bdd
		PreparedStatement prstm;
		try {

			prstm = MaConnexion
					.getInstance()
					.getConnexion()
					.prepareStatement(
							"UPDATE produit " + "SET name = ?," + " price = ?,"
									+ " quantity = ?,"
									+ " unit = ?) WHERE id = ?");
			prstm.setString(1, produit.getName());
			prstm.setDouble(2, produit.getPrice());
			prstm.setInt(3, produit.getQuantity());
			prstm.setString(4, produit.getUnit());
			prstm.setLong(5, produit.getId());

			// résultat de la requête
			prstm.execute(); // preparedstatement returns false on update
			success = (prstm.getUpdateCount() == 1); // (update d'un seul
														// produit)

			// fermeture du preparedstatement
			prstm.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block SQLException
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return success;
	}

	/**
	 * @param produit
	 * @return true si delete ok
	 */
	public boolean delete(Produit produit) {
		boolean success = false;
		// retrait du produit de la bdd
		PreparedStatement prstm;
		try {

			prstm = MaConnexion.getInstance().getConnexion()
					.prepareStatement("DELETE FROM produit WHERE id = ?");
			prstm.setLong(1, produit.getId());

			// résultat de la requête
			prstm.execute(); // preparedstatement returns false on delete
			success = (prstm.getUpdateCount() == 1); // (DELETE d'un seul
														// produit)

			// fermeture du preparedstatement
			prstm.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block SQLException
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return success;
	}

	/**
	 * @return la liste des produits
	 */
	public ArrayList<Produit> getList() {
		ArrayList<Produit> list = new ArrayList<Produit>();

		// récupération en bdd de la liste des produits
		try {

			Statement stmt = MaConnexion.getInstance().getConnexion().createStatement();

			// résultat de la requête
			ResultSet rs = stmt
					.executeQuery("SELECT id, name, price, quantity, unit FROM produit");

			// ajout des produits à la liste qui sera donc mis à jour si la
			// bdd est modifiée
			while (rs.next()) {
				Produit produit = new Produit(rs.getInt("id"),
						rs.getString("name"), rs.getInt("quantity"),
						rs.getString("unit"), rs.getDouble("price"));
				// ajout à la liste si pas déjà présent
				if (!list.contains(produit)) {
					list.add(produit);
				}
			}
			// fermeture du ResultSet
			rs.close();
			// fermeture du statement
			stmt.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block SQLException
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return list;
	}
}
